package com.wuys.frame.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 缩略图、图片水印图、文字水印图 
 * <p>
 *
 * @author   WYS
 * @date	 2015年11月5日
 * @version  V1.0.0
 */
public class ImageHelper {


	/**
	 * 生成缩略图
	 * 保存:ImageIO.write(BufferedImage, imgType[jpg/png/...], File);
	 * 
	 * @param source 原图片
	 * @param width 缩略图宽
	 * @param height 缩略图高
	 * @param b 是否等比缩放
	 * */
	public static BufferedImage Thumb( BufferedImage source, int width, int height, boolean b ) {
		// targetW，targetH分别表示目标长和宽
		int type = source.getType();
		BufferedImage target = null;
		double sx = (double) width / source.getWidth();
		double sy = (double) height / source.getHeight();

		if ( b ) {
			if ( sx > sy ) {
				sx = sy;
				width = (int) (sx * source.getWidth());
			} else {
				sy = sx;
				height = (int) (sy * source.getHeight());
			}
		}

		if ( type == BufferedImage.TYPE_CUSTOM ) {
			ColorModel cm = source.getColorModel();
			WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
			boolean alphaPremultiplied = cm.isAlphaPremultiplied();
			target = new BufferedImage(cm, raster, alphaPremultiplied, null);
		} else
			target = new BufferedImage(width, height, type);
		Graphics2D g = target.createGraphics();
		g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
		g.dispose();
		return target;
	}


	/**
	 * 图片水印
	 * 
	 * @param imgPath 待处理图片
	 * @param markPath 水印图片
	 * @param x 水印位于图片左上角的 x 坐标值
	 * @param y 水印位于图片左上角的 y 坐标值
	 * @param alpha 水印透明度 0.1f ~ 1.0f
	 * */
	public static void waterMark( String imgPath, String markPath, int x, int y, float alpha ) {
		try {
			// 加载待处理图片文件
			Image img = ImageIO.read(new File(imgPath));
			BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null),
					BufferedImage.TYPE_INT_RGB);
			Graphics2D g = image.createGraphics();
			g.drawImage(img, 0, 0, null);

			// 加载水印图片文件
			Image src_biao = ImageIO.read(new File(markPath));
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
			g.drawImage(src_biao, x, y, null);
			g.dispose();

			// 保存处理后的文件
			FileOutputStream out = new FileOutputStream("C:/222.jpg");
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(image);
			out.close();
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}


	/**
	 * 文字水印
	 * 
	 * @param imgPath 待处理图片
	 * @param text 水印文字
	 * @param font 水印字体信息
	 * @param color 水印字体颜色
	 * @param x 水印位于图片左上角的 x 坐标值
	 * @param y 水印位于图片左上角的 y 坐标值
	 * @param alpha 水印透明度 0.1f ~ 1.0f
	 */
	public static void textMark( String imgPath, String text, Font font, Color color, int x, int y, float alpha ) {
		try {
			Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;
			Image img = ImageIO.read(new File(imgPath));

			BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null),
					BufferedImage.TYPE_INT_RGB);
			Graphics2D g = image.createGraphics();

			g.drawImage(img, 0, 0, null);
			g.setColor(color);
			g.setFont(Dfont);
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
			g.drawString(text, x, y);
			g.dispose();

			FileOutputStream out = new FileOutputStream("C:/111.jpg");
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(image);
			out.close();
		} catch ( Exception e ) {
			System.out.println(e);
		}
	}


	@SuppressWarnings("static-access")
	public static void main( String[] args ) throws Exception {
		ImageHelper helper = new ImageHelper();
		String sourcePATH = "C:\\jap.jpg";
		String markPATH = "C:/pp.jpg";
		helper.waterMark(sourcePATH, markPATH, 800, 580, 0.5f);

		Font titleFont = new Font("宋体", Font.BOLD, 30);
		helper.textMark(sourcePATH, "襄阳集，版权所有", titleFont, Color.red, 700, 600, 1.0f);
	}
}
